#include <Arduino.h>

void INIT_SERVO();
void PWM_SORT();

/*首先多通道PWM是难以实现的，因为原本只有两个比较事件。
因此在一周期内多次重复使用比较事件成为新的可行路径。
具体思路如下：
1.启用定时器1，启动溢出、比较器A、B三种事件；
2.溢出时重置pwm输出，即所有端口高电平，形成频率相同(50Hz)、同步高
  电平起始点的PWM；
3.将PWM数值由小到大做排列，并将通道号按照数值排列的顺序排列；
4.在比较器A事件触发后，立即调整比较器A的数值至下一个PWM数值，用于
  下一次触发，同时关闭该通道电平；
5.在比较器B事件触发后，立即调整比较器B的数值至下一个PWM数值，用于
  下一次触发，同时关闭该通道电平。
  
比较器A、B是交替触发的，也就是PWM信号由小到大是A、B、A、B、A、B……
这样子触发。

举个例子，例如我有6通道数据{1600，1200，1800，1100，1500，1500}，
                  通道号为{ch1, ch2,  ch3,  ch4,  ch5,  ch6}，
按照流程为首先排序{1100，1200，1500，1500，1600，1800}，
通道号也进行排序  {ch4, ch2， ch5,  ch6,  ch1,  ch3}。
然后首先比较器A先触发ch4的1100，随后是ch5的1500，ch1的1600；
比较器B触发ch2的1200，ch6的1500，ch3的1800。

首先在每次溢出事件中，同步触发高电平，让ch1、ch2、ch3……都变成高电平。
然后比较器A触发ch4的1100，ch4变为低电平，随后是ch5的1500低电平，ch1
的1600低电平；比较器B是独立的，与A类似，触发ch2的1200，ch2变低电平，
随后是ch6的1500低电平，ch3的1800低电平。

下面是细节部分：
1.如果通道数据过于接近，比较器来不及反应怎么办？
  那么由比较器A、B事件触发时分别判断下一次数据是否过于接近这一次事件，
  如果过于接近，那么顺带一起触发掉，如果还有，也一起触发掉。
2.排列事件必须在溢出事件，或者说是高电平起始段完成，为什么呢？
  因为程序必须在完成一次排序后锁死数据，以免在发出PWM信号时发生改动。
  每次高电平触发时吸收一次数据，每周期有且只有一次，可以保证数据在这
  一周期内不发生变化。

更详细的会在程序中说明。
*/